/*
 * 版权所有(C)，方太互联网应用技术部，lizhixing，所有权利保留。
 * <p>
 * 项目名：	algorithm-demo
 * 文件名：	Question045
 * 模块说明：
 * 修改历史：
 * 2025/4/25 - lizhixing - 创建。
 */
package com.lovely602.algorithm.leetcode.leetcode100.hash;


import java.util.*;

/**
 * 49. 字母异位词分组
 * <p>
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * <p>
 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
 * <p>
 * 示例 1:
 * <p>
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出:
 * [["bat"],["nat","tan"],["ate","eat","tea"]]
 * <p>
 * 示例 2:
 * <p>
 * 输入: strs = [""] 输出: [[""]]
 * <p>
 * 示例 3:
 * <p>
 * 输入: strs = ["a"] 输出: [["a"]]
 * <p>
 * 提示：
 * <p>
 * 1 <= strs.length <= 104
 * <p>
 * 0 <= strs[i].length <= 100
 * <p>
 * strs[i] 仅包含小写字母
 *
 * @author lizhixing
 */
public class Question002 {

    public static void main(String[] args) {
        String[] strs = {"11", "32", "12", "23"};
        Question002 question002 = new Question002();
        List<List<String>> listList = question002.groupAnagrams(strs);
        System.out.println();
    }


    /**
     * 由于互为字母异位词的两个字符串包含的字母相同，因此对两个字符串分别进行排序之后得到的字符串一定是相同的，故可以将排序之后的字符串作为哈希表的键。
     * <p>
     * Java
     * JavaScript
     * Golang
     * C++
     * Python3
     */
    public List<List<String>> groupAnagrams(String[] strs) {


        Map<String, List<String>> result = new HashMap<>();

        for (String str : strs) {

            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            result.computeIfAbsent(key, k -> new ArrayList<String>()).add(str);

        }

        return new ArrayList<>(result.values());

    }


}
